package com.mode5.m5_topic;

import com.mode5.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 模式5：通配符（或主题）模式（Topics ，按topic发送接收)
 * 生产者端不只按固定的routing key发送消息，而是按字符串“匹配”发送，消费者端同样如此。
 * 与之前的路由模式相比，它将信息的传输类型的key更加细化，以“key1.key2.keyN…”的模式来指定信息传输的key的大类型和大类型下面的小类型，
 * 让消费者端可以更加精细的确认自己想要获取的信息类型。而在消费者端，不用精确的指定具体到哪一个大类型下的小类型的key，而是可以使用类似正
 * 则表达式(但与正则表达式规则完全不同)的通配符在指定一定范围或符合某一个字符串匹配规则的key，来获取想要的信息。
 * “通配符交换机”（Topic Exchange）将路由键和某模式进行匹配。此时队列需要绑定在一个模式上。符号“#”匹配一个或多个词，符号“*”仅匹配一个词。
 *
 *  //同一时刻服务器只发送1条消息给消费者（能者多劳，消费消息快的，会消费更多的消息）
 *  //保证在接收端一个消息没有处理完时不会接收另一个消息，即消费者端发送了ack后才会接收下一个消息。
 *  //在这种情况下生产者端会尝试把消息发送给下一个空闲的消费者。
 *  channel.basicQos(1);
 *
 *
 */
public class Producter {

    private static final String EXCHANGE_NAME = "topic_exchange";

    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = ConnectionUtil.getConnection();
        Channel channel =connection.createChannel();
        //声明交换机类型为topic
        channel.exchangeDeclare(EXCHANGE_NAME, "topic");

        String message = "发布了一条中国新闻消息";
        channel.basicPublish(EXCHANGE_NAME, "china.news", null, message.getBytes());

        message = "发布了一条中国天气消息";
        channel.basicPublish(EXCHANGE_NAME, "china.weather", null, message.getBytes());

        message = "发布了一条美国新闻消息";
        channel.basicPublish(EXCHANGE_NAME, "usa.news", null, message.getBytes());

        message = "发布了一条美国天气消息";
        channel.basicPublish(EXCHANGE_NAME, "usa.weather", null, message.getBytes());
    }
}
